package bank;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import exception.KontoNichtGefundenException;
import exception.KundeNichtGefundenException;
import exception.KundennummerBereitsVergebenException;

public class Kunden extends AbstractModel {

    private static final long serialVersionUID = 100L;

    private static final String PROPERTYNAME_KUNDEN = "kunden";

    private final Map<Integer, Kunde> kunden;


	public Kunden() {
		kunden = new HashMap<Integer, Kunde>();
	}

	public Kunde anlegenKunde(String kundenName, int kundenNummer) throws KundennummerBereitsVergebenException {
		Kunde kunde = new Kunde(kundenName, kundenNummer);
		for (Entry<Integer, Kunde> entry : kunden.entrySet()) {
			if (entry.getValue().getKundennummer() == kundenNummer) {
				throw new KundennummerBereitsVergebenException(kundenNummer);
			}
		}
		addKunde(kunde);
		return kunde;
	}

	private void addKunde(Kunde aKunde) {
        kunden.put(new Integer(aKunde.getKundennummer()), aKunde);
        firePropertyChange(PROPERTYNAME_KUNDEN, null, kunden);
	}

	public Kunde getKundeByKontoNummer(int aKontonummer) throws KontoNichtGefundenException {
		for (Entry<Integer, Kunde> entry : kunden.entrySet()) {
		    try {
		        entry.getValue().getKonto(aKontonummer);
		        return entry.getValue();
		    } catch (KontoNichtGefundenException e) {
		        // Ignorieren...
		    }
		}
		throw new KontoNichtGefundenException(aKontonummer);
	}

	public Kunde getKundeByKundenNummer(int aKundennummer) throws KundeNichtGefundenException {
	    Kunde kunde = kunden.get(new Integer(aKundennummer));

	    if (kunde == null) {
	        throw new KundeNichtGefundenException(aKundennummer);
	    }
	    return kunde;
	}

	public Konto getKontoByKontoNummer(int akontoNummer) throws KontoNichtGefundenException {
		Konto kunde = getKundeByKontoNummer(akontoNummer).getKonto(akontoNummer);
		return kunde;
	}

	public List<Kunde> getKundenListe() {
		List<Kunde> temp = new ArrayList<Kunde>();
		for (Entry<Integer, Kunde> entry : kunden.entrySet()) {
			temp.add(entry.getValue());
		}
		return temp;
	}
}
